package com.brian.app_core_lib.appstarter;

import android.app.Application;
import android.os.Build;

import androidx.annotation.RequiresApi;

import com.brian.app_core_lib.appstarter.itask.PfStarterTask;
import com.brian.app_core_libstarter.application.ApplicationTaskManagerService;

/***
 * 应用程序 启动入口函数 将会管理所有 在
 * application 中oncreate 方法中初始化的 sdk 或者其他的 类
 * 内部会使用线程池 和 空闲 handler 机制
 * 并且会根据 任务的优先级和依赖顺序来生成 拓扑图 先后执行
 * 从而实现 快速进入app 的策略
 */
public class ApplicationStarterManagerDefault {

    /*** 经典 volatile + 双重检验锁机制 ***/
    private static volatile ApplicationStarterManagerDefault aDefault;

    public static ApplicationStarterManagerDefault getInstance(){
        if(null == aDefault){
            synchronized (ApplicationStarterManagerDefault.class) {
                if(null == aDefault){
                    aDefault = new ApplicationStarterManagerDefault();
                }
            }
        }
        return aDefault;
    }

    private volatile ApplicationTaskManagerService service;

    private ApplicationStarterManagerDefault(){
        if(!checkSupport()) return;
        service = new ApplicationTaskManagerService();
    }

    public ApplicationStarterManagerDefault getDefault(Application application){
        if(!checkSupport()) return this;
        checkNull();
        service.init(application);
        return this;
    }

    public ApplicationStarterManagerDefault addTask(PfStarterTask threadTask){
        if(!checkSupport()) return this;
        checkNull();
        service.addTask(threadTask);
        return this;
    }

    public ApplicationStarterManagerDefault await(){
        if(!checkSupport()) return this;
        checkNull();
        service.await();
        return this;
    }

    public void start(){
        if(!checkSupport()) return;
        checkNull();
        service.start();
    }

    public void cancle(){
        if(!checkSupport()) return;
        checkNull();
        service.cancle();
    }

    private void checkNull(){
        if(null == service) throw new RuntimeException("service is null, please init ApplicationTaskManagerService.");
    }

    private boolean checkSupport(){
        return android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
    }

}
